//
//  ViewController.swift
//  BDBoxDemo
//
//  Created by QZBD on 2017/11/28.
//  Copyright © 2017年 BDBoxSDK. All rights reserved.
//

import UIKit
import BDBox
import CoreBluetooth

var Countdown = 0 // 倒计时

class ViewController: UIViewController {

    @IBOutlet weak var showMsgTextView: UITextView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.view.backgroundColor = UIColor.white
        
        /// 设置代理
        Bluetooth.delegate = self as? BluetoothToolsDelegate
    }


    // 连接北斗蓝牙设备 - 使用sdk提供的连接视图
    @IBAction func connectBox() {
        Bluetooth.connect()
        
    }
    
    // 自定义连接盒子的视图 -需要两部操作，1、搜索盒子  2、连接盒子
    @IBAction func customCnnectBoxView() {
        //
        print("跳转到CustomConnectView了")
    }
    
    // 发送消息 消息内容+定位信息
    @IBAction func sendMessage() {
        // 发送消息之前一定要先判断是否满足发送条件
        if !self.getSendCondition() {
            // 如果不满足条件，不可以发送
            return;
        }
        //发送目标盒子id
        let boxID = Bluetooth.box.ID // 现在自己发给自己
        /// isPushLocation 是否发送位置  longitude/latitude 经纬度
        Bluetooth.boxMsg.sendMessage(boxId: boxID as String, content: "北斗短报文", isPushLocation: true, longitude: "113.44613", latitude: "23.15796")
    }
    
    // 发送消息 消息内容
    @IBAction func sendMessage2() {
        // 发送消息之前一定要先判断是否满足发送条件
        if !self.getSendCondition() {
            // 如果不满足条件，不可以发送
            return;
        }
        //发送目标盒子id
        let boxID = Bluetooth.box.ID // 现在自己发给自己
        Bluetooth.boxMsg.sendMessage(boxId: boxID as String, content: "北斗短报文")
    }
    
    // 发送自定义消息协议
    @IBAction func sendCustomMessage() {
        // 发送消息之前一定要先判断是否满足发送条件
        if !self.getSendCondition() {
            // 如果不满足条件，不可以发送
            return;
        }
        // 发送自定义协议，协议内容必须为 十六进制 -- 否则可能会奔溃
        var hex = CustomTools.chinese(toHex: "这是一条自定义的短报文内容")! // 汉字要求在35个字内
        /// 建议在十六进制数据前面加一个数据类型 这里的B1就是代表某种数据，解析十六进制的时候就可以截取出来用于判断不同的数据类型
        hex = "B1"+hex
        //发送目标盒子id
        let boxID = Bluetooth.box.ID // 现在自己发给自己
        Bluetooth.boxMsg.sendMessage(boxId: boxID as String, hexString: hex)
    }
    
    // 清除信息
    @IBAction func cleanInfo() {
        self.showMsgTextView.text = "消息:"
    }
    
    // 断开连接
    @IBAction func disconnect(){
        // 取消连接
        Bluetooth.cancelConnection()
    }
    
    func getSendCondition()-> Bool {
        ///1、如果还没有结束倒计时 则表示频度未到
        if Countdown > 0 {
            print("频度未到")
            showInfo("频度未到，请\(Countdown)秒后再重试")
            return false; // 不能发送消息
        }
        // 2、判断信号强度是否满足发送消息
        
        if !Bluetooth.box.getSignalStatus() { // 注意这里是 非 ！
            print("信号太弱，请将盒子朝南边")
            showInfo("信号太弱，请将盒子朝南边")
            return false;
        }
        return true
    }
    
    func showInfo(_ text:String){
        var info = self.showMsgTextView.text!;
        info = "\(info)\r\n\(text)"
        self.showMsgTextView.text = info;
    }
    
}

/// 实现蓝牙工具协议
extension ViewController:BluetoothToolsDelegate{
    // 连接成功
    func bluetoothTools(_ bluetoothTools: BDBluetoothTools, didConnect peripheral: CBPeripheral) {
        print("连接成功。。。。")
        showInfo("连接成功")
    }
    
    //连接失败
    func bluetoothTools(_ bluetoothTools: BDBluetoothTools, didFailToConnect peripheral: CBPeripheral) {
        print("连接失败")
        showInfo("连接失败")
    }
    
    // 断开连接
    func bluetoothTools(_ bluetoothTools: BDBluetoothTools, didDisconnectPeripheral peripheral: CBPeripheral) {
        print("断开连接")
        showInfo("断开连接")
    }
    
    /// 接收到盒子数据:明文
    func bluetoothTools(_ bluetoothTools: BDBluetoothTools, didUpdateValueForObject object: [String : String]) {
        // 如果是发送自定义十六进制数据--则这个方法是不会调用的
        print("接收到盒子明文数据:")
        print(object)
    }
    
    //接收到盒子十六进制数据
    func bluetoothTools(_ bluetoothTools: BDBluetoothTools, didUpdateValueForHexString hexString: String) {
        print("接收到盒子十六进制数据:\(hexString)")
        showInfo("接收到盒子十六进制数据:\(hexString)")
        /// 不管是 使用SDK提供的明文发送消息，还是自定义的十六进制发送数据，都会调用这个方法
        /// SDK提供的文明发送数据协议是以 "A4" 开头，所以协议头为A4代表是明文发送的。其他数据为自定义数据
        /// 建议在发送自定义数据的时候在十六进制数据头部加一个标识，已区分不同的数据类型
    }
    
    // 发送结果
    func bluetoothTools(_ bluetoothTools: BDBluetoothTools, sendMessageReslut isError: Bool, message: String) {
        var text = ""
        if isError {
            text = "发送数据错误:\(message)"
            return;
        }
        text = "发送数据成功"
        print(text)
        showInfo(text)

        
    }
    
    // 发送频道倒计时
    func bluetoothTools(_ bluetoothTools: BDBluetoothTools, frequency countdown: Int) {
        print("请\(countdown)秒后才能重新发送")
        Countdown = countdown
    }
    
    // 是否自定义频道倒计时，没隔一定的时间才可以发送一次报文 一般为60秒
    func bluetoothTools(_ bluetoothTools: BDBluetoothTools, customTimer frequency: Int) -> Bool {
        return false // 默认就是false 有SDK控制发送频道 - 不需要实现这个代理方法
    }
    
    // 由于盒子的信号和电池等等其他信息在不断变化，所以5秒会返回一次终端（盒子）的最新信息
    func bluetoothTools(_ bluetoothTools: BDBluetoothTools, updateZDXX box: BDBoxInfo) {
        // box 包含 盒子id 电量、卫星信号等等
        print("电量:\(box.electric)")
        if box.getSignalStatus() {
            print("当前盒子信号良好")
        }else{
            print("当前盒子信号不佳")
        }
    }
}



